/* 数论
* 1.筛质数--埃式筛法 nloglogn st[]中是质数
    for(int i = 2; i <= n; i++){
        if(!st[i]) primes[cnt++] = i;
        for(int j = 2*i; j <= n; j++)
            st[j] = true;
    }

    线性筛法
    for(int i = 2; i <= n; i++){
        if(!st[i]) primes[cnt++] = i;
        for(int j = 0; primes[j]*i <= n; j++)
        {
            st[primes[j]*i] = true;
            if(i % primes[j] == 0) break;
        }
    }

*/

#define DEBUG
#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")


#include <iostream>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1e5+10;
int primes[N], cnt;
bool st[N];

int color;

void init(int n)
{
    for(int i = 2; i <= n; i++){
        if(!st[i]) primes[cnt++] = i;
        for(int j = 0; primes[j]*i <= n; j++)
        {
            st[primes[j]*i] = true;
            if(i % primes[j] == 0) break;
        }
    }
}

int main()
{
    #ifdef DEBUG
        freopen("./in.txt", "r", stdin);
    #else
        ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #endif

    int n; cin >> n;
    
    init(n+1);

    if(n <= 2) puts("1");
    else puts("2"); //质数染1 合数染2
    for(int i = 2; i <= n+1; i++)
        if(!st[i]) printf("1 ");
        else printf("2 ");
    
    return 0;
}